// utils/request.js

const BASE_URL = 'http://123.56.105.243:8080'; // 替换为你的后端API地址
const TOKEN_EXPIRE_TIME = 7200 * 1000; // token有效期，假设为2小时（单位：毫秒）
const REFRESH_TIME = 5 * 60 * 1000; // 提前5分钟刷新token

let isRefreshing = false; // 是否正在刷新token
let requestsQueue = []; // 请求队列

// 获取token
function getToken() {
  return wx.getStorageSync('token');
}

// 设置token
function setToken(token) {
  wx.request({
    url: 'http://123.56.105.243:8080/user/login',
    method:"POST",
    data:{
      account:"admin",
      password:"admin"
    },
    success:res=>{
      wx.setStorageSync('token', res.data.data.token);
      wx.setStorageSync('token_time', Date.now()); // 记录token生成时间
    }
  })
}

// 刷新token
function refreshToken() {
  return new Promise((resolve, reject) => {
    wx.request({
      url: `${BASE_URL}/user/login`, // 替换为你的刷新token接口
      method: 'POST',
      data:{
        account:"admin",
        password:"admin"
      },
      success: (res) => {
        if (res.statusCode === 200 && res.data.data.token) {
          setToken(res.data.data.token); // 更新token
          resolve(res.data.data.token);
        } else {
          reject(new Error('刷新token失败'));
        }
      },
      fail: (err) => {
        reject(err);
      }
    });
  });
}

// 检查token是否需要刷新
function checkToken() {
  const tokenTime = wx.getStorageSync('token_time');
  const currentTime = Date.now();
  return currentTime - tokenTime > TOKEN_EXPIRE_TIME - REFRESH_TIME;
}
// 封装的request方法
function request(options) {
  return new Promise((resolve, reject) => {
    // 请求拦截器
    const token = getToken();
    if (token) {
      options.header = options.header || {};
      options.header['token'] = `${token}`;
    }

    // 检查token是否需要刷新
    if (checkToken() && !isRefreshing) {
      isRefreshing = true;
      refreshToken()
        .then((newToken) => {
          // 更新请求头中的token
          options.header['token'] = `${newToken}`;
          // 重新发送队列中的请求
          requestsQueue.forEach(cb => cb(newToken));
          requestsQueue = [];
          isRefreshing = false;
        })
        .catch((err) => {
          requestsQueue = [];
          isRefreshing = false;
          reject(err);
        });
    }

    // 如果正在刷新token，将请求放入队列
    if (isRefreshing) {
      requestsQueue.push((newToken) => {
        options.header['token'] = `${newToken}`;
        sendRequest(options, resolve, reject);
      });
    } else {
      sendRequest(options, resolve, reject);
    }
  });
}

// 发送请求
function sendRequest(options, resolve, reject) {
  wx.request({
    ...options,
    url: `${BASE_URL}${options.url}`,
    success: (res) => {
      if (res.statusCode === 401) {
        // token过期，尝试刷新token
        refreshToken()
          .then((newToken) => {
            options.header['token'] = `${newToken}`;
            sendRequest(options, resolve, reject);
          })
          .catch((err) => {
            reject(err);
          });
      } else {
        resolve(res);
      }
    },
    fail: (err) => {
      reject(err);
    }
  });
}

module.exports = {
  request
};